package com.yww.datastructure.queue;

import java.util.Iterator;

/**
 * @author yww
 * @description 队列
 * @since 2024/2/4 9:36
 */
public interface Queue<E> extends Iterable<E> {

    /**
     * 向队列尾插入值
     *
     * @param value 待插入值
     * @return 插入成功返回 true, 插入失败返回 false
     */
    boolean offer(E value);

    /**
     * 从对列头获取值, 并移除
     *
     * @return 如果队列非空返回对头值, 否则返回 null
     */
    E poll();

    /**
     * 从对列头获取值, 不移除
     *
     * @return 如果队列非空返回对头值, 否则返回 null
     */
    E peek();

    /**
     * 检查队列是否为空
     *
     * @return 空返回 true, 否则返回 false
     */
    boolean isEmpty();

    /**
     * 检查队列是否已满
     *
     * @return 满返回 true, 否则返回 false
     */
    boolean isFull();

    /**
     * 获取队列元素个数
     *
     * @return size
     */
    int size();

    default String asString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for (E e : this) {
            stringBuilder.append(e);
            stringBuilder.append(", ");
        }

        if (!isEmpty()) {
            stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(" "));
            stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(","));
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }

    default IllegalArgumentException illegalIndex(int index) {
        return new IllegalArgumentException(String.format("index [%d] 不合法！%n", index));
    }
}
